#ifndef GHMODEL_H
#define GHMODEL_H

#include "boofergh.h"
#include <QtGui>
#include "QAbstractTableModel"
/*!
 * \brief GHModel class отвечает за взаимо-однозначное соответствие данных ГХ, хранящихся в классе BooferGH и данных ГХ, отображаемых в интерфейсе пользователя в виде таблицы.
 * Также определяет множество возможных манипуляций с данными ГХ и с их представлением
 */
class GHModel : public QAbstractTableModel   // технология модель - представление
{
    Q_OBJECT

public:
    /*!
     * \brief GHModel Конструктор класса
     *
     * \param data - данные, хранящиеся в модели
     * \param parent - объект интерфейса, в котором хранится виджет, содержащий GHModel
     */
    GHModel(BooferGH *data, QObject *parent = 0);
    /*!
     * \brief rowCount возвращает количество строк в модели
     *
     * \return количество строк
     */
    int rowCount(const QModelIndex& parent=QModelIndex()) const;
    /*!
     * \brief columnCount возвращает количество cтолбцов в модели
     *
     * \return количество строк
     */
    int columnCount(const QModelIndex& parent=QModelIndex()) const;
    /*!
     * \brief headerData возвращает заголовок столбца или его форматирование
     *
     * \param section номер строки или колонки
     * \param orientation ориентация: Horizontal или Vertical
     * \param role роль элемента
     * \return заголовок столбца или его форматирование
     */
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
    /*!
     * \brief flags возвращает параметры элемента (можно ли его редактировать, включать в выделение, перетаскивать)
     *
     * \param index индекс элемента
     * \return параметры элемента
     */
    Qt::ItemFlags flags(const QModelIndex& index) const;
    /*!
     * \brief data возвращает содержимое элемента или его форматирование
     *
     * \param index индекс элемента
     * \param role роль элемента
     * \return содержимое элемента или его форматирование
     */
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    /*!
     * \brief setData метод для редактирования элемента пользователем
     *
     * \param index индекс элемента
     * \param value новое значение элемента
     * \param role роль элемента
     * \return true, если релактирование прошло успешно, false в противном случае
     */
    bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole);
    /*!
     * \brief insertRows метод для добавления строк
     *
     * \param row строка после которой будут добавлены новые строки
     * \param count количество добавляемых строк
     * \return true, если вставка строк прошло успешно, false в противном случае
     */
    bool insertRows(int row, int count, const QModelIndex& parent=QModelIndex());
    /*!
     * \brief push_back_pair добавляет строку из двух заданных элементов в конец модели
     *
     * \param x первый элемент
     * \param y второй элемент
     * \return true, если вставка строки прошло успешно, false в противном случае
     */
    bool push_back_pair(double x, double y, const QModelIndex& parent=QModelIndex());
    /*!
     * \brief removeRows метод для удаления строк
     * \param row строка, начиная с которой будут удаляться строки
     * \param count количество удаляемых строк
     * \return true, если удаление строк прошло успешно, false в противном случае
     */
    bool removeRows(int row, int count, const QModelIndex& parent=QModelIndex());
    /*!
     * \brief setHeader устанавливает заголовки для колонок таблицы
     * \param header список названий заголовков
     */
    void setHeader(const QStringList &header);

private:
    /// класс для хранения данных модели
    BooferGH *boofer;
    /// заголовки столбцов модели
    QStringList m_header;
};

#endif // GHMODEL_H
